/** 
 *  @file
 *  @brief   T形（T）梁截面属性使用数值方法计算类
 *  @author  hongjiaqi
 *  @date    2024.07.19
 *  @version v1.0
 *  @par Copyright(c):  ShenGong  Simulation corporation
 */

#pragma once
#include "gtest/gtest.h"
#include "Utility/FileSystem/SGFileSystem.h"
#include "../Interface/BeamSectionNumericalCalculatorFactory.h"
#include "../TSectionNumericalCalculator.h"
#include "../SectionCalculator/writeVtk.h"

using SG::DataStructure::FEM::BeamSectionStandardTypes;
using SG::DataStructure::FEM::PBARLData;
using SG::FEMSolver::Element::BeamSectionNumericalCalculatorFactory;
using SG::FEMSolver::Element::TSectionNumericalCalculator;

// 将 BeamSectionNumericalCalculatorFactory 生成对象测试放置在具体截面属性计算中
TEST (BeamSectionNumericalCalculatorFactoryTest, TSectionCalculatorCreate)
{
    // Test data
    auto calculatorPtr = BeamSectionNumericalCalculatorFactory::Create (BeamSectionStandardTypes::BEAMSECTYPE_T);
    auto TCalculatorPtr = dynamic_cast<TSectionNumericalCalculator*> (calculatorPtr.get ());

    // Check
    ASSERT_TRUE (nullptr != TCalculatorPtr);
}

// T 截面网格划分测试
TEST (BeamSectionNumericalMeshTest, TSection)
{
    // Input data
    PBARLData section;
    section.SetBeamSectionStandardTypes (BeamSectionStandardTypes::BEAMSECTYPE_T);
    section.m_dimension = {10.0, 12.0, 4.0, 5.0};
    int refineLevel{0};

    // Test data
    Meshes meshes;
    TSectionNumericalCalculator TSecMesher;
    TSecMesher.Mesh (section, _OUT meshes, refineLevel);
    std::string filename = "TBeamSectionMesh";
    std::string discription = "T-Type Beam Section Mesh";
    SG::FEMSolver::Element::writeVtk (meshes, filename, discription);
    auto fileTest = SG::Utility::FileSystem::getFullPath (filename + ".vtk");

    // Target data
    auto fileTarget = SG::Utility::FileSystem::getTestDataPath ("SGFem/BeamSecPropCalculator/" + filename + "Target.vtk");

    // Check
    ASSERT_TRUE (SG::Utility::FileSystem::compareVTK (fileTarget, fileTest));
}